//package com.boot.utils;
//
//import cn.hutool.http.ssl.TrustAnyHostnameVerifier;
//import okhttp3.*;
//import org.apache.commons.net.util.TrustManagerUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.util.CollectionUtils;
//
//import javax.net.ssl.SSLContext;
//import javax.net.ssl.SSLSocketFactory;
//import javax.net.ssl.TrustManager;
//import java.io.File;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.net.InetSocketAddress;
//import java.net.Proxy;
//import java.security.KeyManagementException;
//import java.security.NoSuchAlgorithmException;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.concurrent.TimeUnit;
//
///**
// * 网络请求类，所有网络请求通过请求该类
// */
//public final class HttpUtils2 {
//    private static final Logger logger = LoggerFactory.getLogger(HttpUtils2.class);
//    private static final int DEFAULT_READ_TIMEOUT = 10;
//    private static final int DEFAULT_CONNECT_TIMEOUT = 10;
//    private static final int DEFAULT_WRITE_TIMEOUT = 10;
//    private static final int DEFAULT_UPLOAD_TIMEOUT = 60;
//    private static final int DEFAULT_DOWNLOAD_BUFFER_SIZE = 1024 * 5;
//
//    private static final boolean DEFAULT_IGNORE_SSL = true;
//    private static final MediaType MEDIA_TYPE_OF_STREAM = MediaType.parse("application/octet-stream");
//    private static final MediaType MEDIA_TYPE_OF_TEXT = MediaType.parse("text/x-markdown; charset=utf-8");
//    private static final MediaType MEDIA_TYPE_OF_JSON = MediaType.parse("application/json");
//
//    private static final OkHttpClient httpClient = new OkHttpClient.Builder()
//            .connectTimeout(DEFAULT_CONNECT_TIMEOUT, TimeUnit.SECONDS)
//            .readTimeout(DEFAULT_READ_TIMEOUT, TimeUnit.SECONDS)
//            .writeTimeout(DEFAULT_WRITE_TIMEOUT, TimeUnit.SECONDS).build();
//
//    public static final String PROXY_HOST_KEY ="proxyHost";
//    public static final String PROXY_PORT_KEY = "proxyPort";
//
//
//    /*------------ 同步方法 -------------*/
//
//    /**
//     * 同步get方法
//     *
//     * @param url 请求链接
//     * @return 响应
//     * @throws IOException
//     */
//    public static String get(String url) throws IOException {
//
//        return get(url, null);
//    }
//
//    /**
//     * 同步get方法
//     *
//     * @param url     请求链接
//     * @param headers header参数
//     * @return 响应
//     * @throws IOException
//     */
//    public static String get(String url, Map<String, String> headers) throws IOException {
//
//        Request.Builder requestBuilder = new Request.Builder();
//
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//
//        Request request = requestBuilder.url(url).build();
//
//        try (ResponseBody responseBody = execute(request,null);) {
//            return responseBody.string();
//        }
//    }
//
//    /**
//     * 同步post方法
//     *
//     * @param url     请求链接
//     * @param headers header参数
//     * @param body    body请求体数据
//     * @return
//     * @throws IOException
//     */
//    public static String post(String url, Map<String, String> headers, byte[] body) throws IOException {
//
//        Request.Builder requestBuilder = new Request.Builder();
//        requestBuilder.post(RequestBody.create(null, body));
//
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//
//        Request request = requestBuilder.url(url).build();
//
//        try (ResponseBody responseBody = execute(request,null)) {
//            return responseBody.string();
//        }
//    }
//
//    /**
//     * 同步post方法
//     *
//     * @param url        请求链接
//     * @param headers    header参数
//     * @param parameters 请求参数
//     * @return
//     * @throws IOException
//     */
//    public static String post(String url, Map<String, String> headers, Map<String, String> parameters)
//            throws IOException {
//
//        FormBody.Builder builder = new FormBody.Builder();
//
//        if (parameters != null) {
//            parameters.forEach(builder::add);
//        }
//        Request.Builder requestBuilder = new Request.Builder();
//
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//        Request request = requestBuilder.url(url).post(builder.build()).build();
//
//        try (ResponseBody responseBody = execute(request,null)) {
//            return responseBody.string();
//        }
//    }
//
//    /**
//     * 同步post方法
//     *
//     * @param url        请求链接
//     * @param headers    header参数
//     * @param jsonString 请求参数
//     * @return
//     * @throws IOException
//     */
//    public static String postJson(String url, Map<String, String> headers, String jsonString,int connectTimeout, int readTimeout)
//            throws IOException {
//
//        RequestBody requestBody = RequestBody.create(MEDIA_TYPE_OF_JSON, jsonString);
//        Request.Builder requestBuilder = new Request.Builder();
//
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//        Request request = requestBuilder.url(url).post(requestBody).build();
//
//        try (ResponseBody responseBody = execute(request,null,connectTimeout,readTimeout,0)) {
//            return responseBody.string();
//        }
//    }
//    /**
//     * 同步post方法，支持传入代理
//     *
//     * @param url        请求链接
//     * @param headers    header参数
//     * @param jsonStr 请求参数
//     * @return
//     */
//    public static String postJson(String url, Map<String, String> headers, String jsonStr, HashMap<String, String> proxyMap) {
//        logger.info("HttpUtils postJson url：{}", url);
//        logger.info("HttpUtils postJson params：{}", jsonStr);
//        Request.Builder requestBuilder = new Request.Builder();
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//        Request request = requestBuilder.url(url).post(RequestBody.create(MEDIA_TYPE_OF_JSON, jsonStr)).build();
//        try (ResponseBody responseBody = execute(request,proxyMap)) {
//            String result = responseBody.string();
//            return result;
//        }catch (Exception e){
//            logger.error("HttpUtils postJson error", e);
//            return null;
//        }
//    }
//    /**
//     * 同步post方法
//     *
//     * @param url        请求链接
//     * @param headers    header参数
//     * @param requestBody 请求参数
//     * @param connectTimeout 连接超时
//     * @param readTimeout 读取超时
//     * @return
//     * @throws IOException
//     */
//    public static String post(String url, Map<String, String> headers, String requestBody,int connectTimeout, int readTimeout)
//            throws IOException {
//
//        Request.Builder requestBuilder = new Request.Builder();
//
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//        Request request = requestBuilder.url(url).post(RequestBody.create(MEDIA_TYPE_OF_TEXT, requestBody)).build();
//
//        try (ResponseBody responseBody = execute(request,null,connectTimeout,readTimeout,0)) {
//            return responseBody.string();
//        }
//    }
//
//    /**
//     * 同步post方法
//     *
//     * @param url        请求链接
//     * @param headers    header参数
//     * @param parameters 请求参数
//     * @return
//     * @throws IOException
//     */
//    public static ResponseBody postRaw(String url, Map<String, String> headers, Map<String, String> parameters)
//            throws IOException {
//
//        FormBody.Builder builder = new FormBody.Builder();
//
//        if (parameters != null) {
//            parameters.forEach(builder::add);
//        }
//        Request.Builder requestBuilder = new Request.Builder();
//
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//        Request request = requestBuilder.url(url).post(builder.build()).build();
//
//        return execute(request,null);
//    }
//
//    /**
//     * 文件上传
//     *
//     * @param url        请求链接
//     * @param fileName   文件路径
//     * @param parameters 表单参数
//     * @param headers    header数据
//     * @return
//     * @throws IOException
//     */
//    public static String upload(String url, String fileName, Map<String, Object> parameters,
//                                Map<String, String> headers) throws IOException {
//
//        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
//
//        if (parameters != null) {
//            parameters.forEach((k, v) -> {
//                if (v instanceof File) {
//                    final File file = (File) v;
//                    builder.addFormDataPart(k, fileName, RequestBody.create(MEDIA_TYPE_OF_STREAM, file));
//                } else {
//                    builder.addFormDataPart(k, v.toString());
//                }
//            });
//        }
//
//        Request.Builder requestBuilder = new Request.Builder();
//
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//
//        final Request request = requestBuilder.url(url).post(builder.build()).build();
//
//        try (ResponseBody responseBody = execute(request,null, 0, 0, DEFAULT_UPLOAD_TIMEOUT);) {
//            return responseBody.string();
//        }
//    }
//
//    /**
//     * 下载
//     *
//     * @param url      请求链接
//     * @param filePath 文件路径
//     * @throws IOException
//     */
//    public static void download(String url, String filePath) throws IOException {
//        download(url, filePath, "", null);
//    }
//
//    /**
//     * 下载
//     *
//     * @param url      请求链接
//     * @param filePath 文件路径
//     * @param fileHash 文件hash值
//     * @param listener 文件的回调
//     * @throws IOException
//     */
//    public static void download(String url, String filePath, String fileHash, OnProgressListener listener) throws IOException {
//
//        Request.Builder requestBuilder = new Request.Builder();
//        Request request = requestBuilder.url(url).build();
//
//        File file = new File(filePath);
//        File parentFile = file.getParentFile();
//        if (!parentFile.exists()) {
//            parentFile.mkdirs();
//        }
//        if (file.exists()) {
//            file.delete();
//        }
//
//        try (ResponseBody responseBody = execute(request,null); InputStream inputStream = responseBody.byteStream()) {
//
//            long total = responseBody.contentLength();
//
//            int length = 0;
//            byte[] buffer = new byte[DEFAULT_DOWNLOAD_BUFFER_SIZE];
//
//            try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
//
//                int progress = 0;
//
//                while ((length = inputStream.read(buffer)) != -1) {
//
//                    fileOutputStream.write(buffer, 0, length);
//
//                    if (listener != null) {
//                        progress += length;
//                        listener.onProgress(progress, total);
//                    }
//                }
//
//                fileOutputStream.flush();
//            }
//
//            if (listener != null) {
//                listener.onComplete(file.getPath(), fileHash);
//            }
//        } catch (Exception e) {
//            logger.error("download failed", e);
//        }
//    }
//
//    private static ResponseBody execute(Request request,HashMap<String,String> proxyMap) throws IOException {
//        return execute(request,proxyMap, 0, 0, 0);
//    }
//
//    private static ResponseBody execute(Request request,HashMap<String,String> proxyMap, int connectTimeout, int readTimeout, int writeTimeout)
//            throws IOException {
//
//        OkHttpClient.Builder builder = createBuilder(connectTimeout, readTimeout, writeTimeout,proxyMap);
//
//        Response response = builder.build().newCall(request).execute();
//
////        if (!response.isSuccessful()) {
////            response.close();
////        }
//
//        return response.body();
//    }
//    /*------------ 同步方法结束 ----------------*/
//
////--------------------------------------------------------------------------
//
//    /*------------ 异步方法开始 -------------*/
//
//    public static void asyncGet(String url, Callback callback) {
//        asyncGet(url, null,null, callback);
//    }
//
//    public static void asyncGet(String url, Map<String, String> headers,HashMap<String,String> proxyMap, Callback callback) {
//
//        Request.Builder requestBuilder = new Request.Builder();
//
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//
//        Request request = requestBuilder.url(url).build();
//
//        asyncExecute(request,proxyMap, callback);
//
//    }
//
//    public static void asyncPost(String url, Map<String, String> headers, byte[] body,HashMap<String,String> proxyMap,Callback callback) {
//
//        Request.Builder requestBuilder = new Request.Builder();
//        requestBuilder.post(RequestBody.create(null, body));
//
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//
//        Request request = requestBuilder.url(url).build();
//
//        asyncExecute(request, proxyMap,callback);
//    }
//
//    public static void asyncPost(String url, Map<String, String> headers, Map<String, String> parameters,HashMap<String,String> proxyMap, Callback callback) {
//
//        FormBody.Builder builder = new FormBody.Builder();
//
//        if (parameters != null) {
//            parameters.forEach(builder::add);
//        }
//        Request.Builder requestBuilder = new Request.Builder();
//
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//        Request request = requestBuilder.url(url).post(builder.build()).build();
//        asyncExecute(request,proxyMap, callback);
//    }
//
//
//    public static void asyncPost(String url, Map<String, String> headers, String requestBodyText,HashMap<String,String> proxyMap, Callback callback) {
//        Request.Builder requestBuilder = new Request.Builder();
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//        Request request = requestBuilder.url(url).post(RequestBody.create(MEDIA_TYPE_OF_TEXT, requestBodyText)).build();
//        asyncExecute(request,proxyMap, callback);
//    }
//
//    public static void asyncUpload(String url, String uploadedFilename, Map<String, Object> parameters,
//                                   Map<String, String> headers,HashMap<String,String> proxyMap, Callback callback) {
//
//        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
//
//        if (parameters != null) {
//            parameters.forEach((k, v) -> {
//                if (v instanceof File) {
//                    final File file = (File) v;
//                    builder.addFormDataPart(k, uploadedFilename, RequestBody.create(MEDIA_TYPE_OF_STREAM, file));
//                } else {
//                    builder.addFormDataPart(k, v.toString());
//                }
//            });
//        }
//
//        Request.Builder requestBuilder = new Request.Builder();
//
//        if (headers != null) {
//            headers.forEach(requestBuilder::addHeader);
//        }
//
//        final Request request = requestBuilder.url(url).post(builder.build()).build();
//
//        asyncExecute(request, callback, 0, 0, DEFAULT_UPLOAD_TIMEOUT,proxyMap);
//    }
//
//    private static void asyncExecute(Request request,HashMap<String,String> proxyMap,Callback callback) {
//        asyncExecute(request, callback, 0, 0, 0,proxyMap);
//    }
//
//    private static void asyncExecute(Request request, Callback callback, int connectTimeout, int readTimeout, int writeTimeout,HashMap<String,String> proxyMap) {
//        OkHttpClient.Builder builder = createBuilder(connectTimeout, readTimeout, writeTimeout,proxyMap);
//        builder.build().newCall(request).enqueue(callback);
//    }
//
//    /*------------ 异步方法结束 -------------*/
//
//    private static OkHttpClient.Builder createBuilder(int connectTimeout, int readTimeout, int writeTimeout, HashMap<String,String> proxyMap) {
//        OkHttpClient.Builder builder = httpClient.newBuilder();
//
//        if (connectTimeout >= 1) {
//            builder.connectTimeout(connectTimeout, TimeUnit.SECONDS);
//        }
//
//        if (writeTimeout >= 1) {
//            builder.writeTimeout(writeTimeout, TimeUnit.SECONDS);
//        }
//
//        if (readTimeout >= 1) {
//            builder.readTimeout(readTimeout, TimeUnit.SECONDS);
//        }
//
//        if (DEFAULT_IGNORE_SSL) {
//
//            builder.hostnameVerifier(new TrustAnyHostnameVerifier());
//            if(!CollectionUtils.isEmpty(proxyMap)){
//                String proxyHost = proxyMap.get(PROXY_HOST_KEY);
//                Integer proxyPort = Integer.valueOf(proxyMap.get(PROXY_PORT_KEY));
//                builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost,proxyPort)));
//            }
//            try {
//                builder.sslSocketFactory(ignoreSSLSocketFactory(), TrustManagerUtils.getAcceptAllTrustManager());
//            } catch (KeyManagementException | NoSuchAlgorithmException e) {
//                logger.error("http error", e);
//            }
//        }
//
//        return builder;
//    }
//
//    private static SSLSocketFactory ignoreSSLSocketFactory() throws NoSuchAlgorithmException, KeyManagementException {
//
//        final SSLContext sslContext = SSLContext.getInstance(TlsVersion.TLS_1_2.javaName());
//        sslContext.init(null, new TrustManager[]{TrustManagerUtils.getAcceptAllTrustManager()}, null);
//
//        return sslContext.getSocketFactory();
//    }
//
//
//    public interface OnProgressListener {
//
//        void onProgress(long current, long total);
//
//        void onComplete(String filePath, String fileHash);
//    }
//
//
//}
